/**
 * 作者：致心 vue项目所有文件命名全部采用中划线分隔   utils
 * 创建时间：2020/12/8 15:10
 */
import typeOfUtils from "@/utils/type-of-utils";

const STATUS = {
  FIRSTQUARTER: {
    time: {
      begin: '1-1',
      end: '3-31'
    },
    value: 1
  },
  SECONDQUARTER: {
    time: {
      begin: '3-31',
      end: '6-30'
    },
    value: 2
  },
  THIRDQUATER: {
    time: {
      begin: '6-30',
      end: '9-30'
    },
    value: 3
  },
  FOURTHQUARTER: {
    time: {
      begin: '9-30',
      end: '1-1'
    },
    value: 4
  },
};

/**
 * @Description :根据时间获得当前的季度,如果传入的是季度的最后一天,则获取到下一个季度
 * @Author :致心
 * @Date :2020/12/8 15:17
 */
/**
 *
 * @param date {Date}
 * @return {number}
 */
function getQuarter(date) {
  const month = date.getMonth() + 1;
  let date1 = date.getDate();
  const find = Object.values(STATUS).find(value => {
    if (`${month}-${date1}` === value.time.end) { // 如果是季度的最后一天那么就加一天
      date1 = new Date(date.getTime() + 1000 * 60 * 60 * 24).getDate()
    }
    return isDuringDate(`${month}-${date1}`, value.time.begin, value.time.end)
  });
  if (find) {
    return find.value
  }
  return 0
}

/**
 * @Description : 是否在在时间段里面
 * @Author :致心
 * @Date :2020/12/8 15:43
 * @param curDateStr {string}
 * @param beginDateStr {string}
 * @param endDateStr {string}
 * @returns {boolean|boolean}
 */
function isDuringDate(curDateStr, beginDateStr, endDateStr) {
  const data1 = curDateStr.split('-');
  curDateStr = '2000-' + curDateStr
  const data2 = beginDateStr.split('-')
  const data3 = endDateStr.split('-')
  if (Number(data2[0]) > Number(data1[0])) {
    beginDateStr = '1999-' + beginDateStr
  } else {
    beginDateStr = '2000-' + beginDateStr
  }
  if (Number(data2[0]) > Number(data3[0])) {
    endDateStr = '2001-' + endDateStr
  } else {
    endDateStr = '2000-' + endDateStr
  }
  const curDate = new Date(curDateStr).getTime()
  const beginDate = new Date(beginDateStr).getTime()
  const endDate = new Date(endDateStr).getTime()
  return curDate >= beginDate && curDate <= endDate;
}

/**
 * @Description :根据那一年和那个季度获取下一个季度的开始时间和结束时间,这里认为 1 季度可能会出现跨年
 * @Author :致心
 * @Date :2020/12/8 17:01
 * @param year {string|number}
 * @param quarter {number}
 * @returns {{end: string, begin: string}}
 */
function getTheNextQuarter(year, quarter) {
  quarter++
  if (quarter === Object.values(STATUS).length + 1) {
    quarter = 1
  }
  const find = Object.values(STATUS).find(value => {
    return value.value === quarter
  });
  const time = {
    begin: '',
    end: ''
  }
  if (find) {
    time.begin = year + '-' + find.time.begin
    // 如果这个周期的结束时间大于开始时间就是在同一年
    if (new Date(`2020-${find.time.end}`).getTime() > new Date(`2020-${find.time.begin}`).getTime()) {
      if (quarter === 1) {
        time.begin = (Number(year) + 1) + '-' + find.time.begin
      }
    }
    let fullYear = year;
    if (quarter === 1) {
      fullYear++
    }
    time.end = fullYear + '-' + find.time.end
    return time
  }
  return time
}

/**
 * 补零函数
 * @param zero
 * @returns {string}
 */
function doHandleZero(zero) {
  var date = zero;
  if (zero.toString().length === 1) {
    date = "0" + zero;
  }
  return date;
}

/**
 * 获取月份第一天 如果dateStr为null就是当月时间
 * @param dateStr {String}
 * @param toDate {Boolean}
 * @returns {string|Date}
 */
function getMonthFirstDay(dateStr, toDate = false) {
  let date = null
  if (typeOfUtils.isEmpty(dateStr)) {
    date = new Date()
  } else {
    date = new Date(dateStr)
  }
  const tYear = date.getFullYear();
  var tMonth = date.getMonth()
  tMonth = doHandleZero(tMonth + 1)
  if (toDate) {
    return new Date(tYear + "-" + tMonth + "-01")
  }
  return tYear + "-" + tMonth + "-01"
}

/**
 * 根据开始月份和结束月份返回所有的月份
 * @param monthBegin
 * @param monthEnd
 * @return {string[]|[]}
 */
function getMouthLimit(monthBegin = '2021-07',monthEnd = '2021-07') {
  if (typeOfUtils.isEmpty(monthBegin)) {
    throw new Error('开始月份不能为空')
  }
  if (typeOfUtils.isEmpty(monthEnd)) {
    throw new Error('结束月份不能为空')
  }
  if (new Date(monthEnd) < new Date(monthBegin)) {
    throw new Error('时间区间传入错误')
  }
  if (new Date(monthEnd) === new Date(monthBegin)) {
    return [monthBegin]
  }
  const result = []
  const beginYear = new Date(monthBegin).getFullYear()
  const beginMonth = new Date(monthBegin).getMonth() + 1
  const endYear = new Date(monthEnd).getFullYear()
  const endMonth = new Date(monthEnd).getMonth() + 1
  for (let i = beginYear; i <= endYear; i++) {
    for (let j = (i === beginYear ? beginMonth : 1); j <= (i === endYear ? endMonth : 12); j++) {
      result.push(i + '-' + j)
    }
  }
  return result
}

/**
 * 判断是不是闰年
 * @param year
 * @return {boolean|boolean}
 */
function isLeapYear(year) { return (year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0) }

/**
 * 获取月份有多少天
 * @param time
 * @return {number}
 */
function getMonthDays(time = '') {
  if (typeOfUtils.isEmpty(time)) {
    time = new Date()
  }
  time = new Date(time)
  const month = time.getMonth() + 1
  const year = time.getFullYear()
  switch (month) {
    case 1:
      return 31
    case 2:
      return isLeapYear(year) ? 29 : 28
  }
}

const timeQuarterTool = {
  STATUS, // 定义季度
  getMouthLimit, // 根据开始月份和结束月份返回所有的月份
  getQuarter, // 根据时间获得当前的季度,如果传入的是季度的最后一天,则获取到下一个季度
  getTheNextQuarter, // 根据那一年和那个季度获取下一个季度的开始时间和结束时间,这里认为 1 季度可能会出现跨年
  getMonthFirstDay, // 获取月份第一天
  getMonthDays, // 获取月份有多少天
}

export default timeQuarterTool
